// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/audio/audio_streams_tracker.h"

#include <stddef.h>

#include "testing/gtest/include/gtest/gtest.h"

namespace media {

TEST(AudioStreamsTrackerTest, IncreaseAndDecreaseOnce)
{
    AudioStreamsTracker audio_streams_tracker;
    const size_t kNumberOfOperations = 5;

    // Increase count.
    for (size_t i = 1; i <= kNumberOfOperations; ++i) {
        audio_streams_tracker.IncreaseStreamCount();
        EXPECT_EQ(i, audio_streams_tracker.current_stream_count_);
        EXPECT_EQ(i, audio_streams_tracker.max_stream_count());
    }

    // Reset and check max count.
    audio_streams_tracker.ResetMaxStreamCount();
    EXPECT_EQ(kNumberOfOperations, audio_streams_tracker.max_stream_count());

    // Decrease count.
    for (size_t i = 1; i <= kNumberOfOperations; ++i) {
        audio_streams_tracker.DecreaseStreamCount();
        EXPECT_EQ(kNumberOfOperations - i,
            audio_streams_tracker.current_stream_count_);
        EXPECT_EQ(kNumberOfOperations, audio_streams_tracker.max_stream_count());
    }

    // Reset and check max count.
    audio_streams_tracker.ResetMaxStreamCount();
    EXPECT_EQ(0u, audio_streams_tracker.max_stream_count());
}

TEST(AudioStreamsTrackerTest, IncreaseAndDecreaseMultiple)
{
    AudioStreamsTracker audio_streams_tracker;
    const size_t kNumberOfOperations = 5;

    // Increase 2N (N = kNumberOfOperations).
    for (size_t i = 1; i <= 2 * kNumberOfOperations; ++i) {
        audio_streams_tracker.IncreaseStreamCount();
        EXPECT_EQ(i, audio_streams_tracker.current_stream_count_);
        EXPECT_EQ(i, audio_streams_tracker.max_stream_count());
    }

    // Decrease N.
    for (size_t i = 1; i <= kNumberOfOperations; ++i) {
        audio_streams_tracker.DecreaseStreamCount();
        EXPECT_EQ(2 * kNumberOfOperations - i,
            audio_streams_tracker.current_stream_count_);
        EXPECT_EQ(2 * kNumberOfOperations,
            audio_streams_tracker.max_stream_count());
    }

    // Reset and check max count.
    audio_streams_tracker.ResetMaxStreamCount();
    EXPECT_EQ(kNumberOfOperations, audio_streams_tracker.max_stream_count());

    // Increase 2N.
    for (size_t i = 1; i <= 2 * kNumberOfOperations; ++i) {
        audio_streams_tracker.IncreaseStreamCount();
        EXPECT_EQ(kNumberOfOperations + i,
            audio_streams_tracker.current_stream_count_);
        EXPECT_EQ(kNumberOfOperations + i,
            audio_streams_tracker.max_stream_count());
    }

    // Decrease N.
    for (size_t i = 1; i <= kNumberOfOperations; ++i) {
        audio_streams_tracker.DecreaseStreamCount();
        EXPECT_EQ(3 * kNumberOfOperations - i,
            audio_streams_tracker.current_stream_count_);
        EXPECT_EQ(3 * kNumberOfOperations,
            audio_streams_tracker.max_stream_count());
    }

    // Reset and check max count.
    audio_streams_tracker.ResetMaxStreamCount();
    EXPECT_EQ(2 * kNumberOfOperations, audio_streams_tracker.max_stream_count());

    // Decrease 2N.
    for (size_t i = 1; i <= 2 * kNumberOfOperations; ++i) {
        audio_streams_tracker.DecreaseStreamCount();
        EXPECT_EQ(2 * kNumberOfOperations - i,
            audio_streams_tracker.current_stream_count_);
        EXPECT_EQ(2 * kNumberOfOperations,
            audio_streams_tracker.max_stream_count());
    }

    // Reset and check max count.
    audio_streams_tracker.ResetMaxStreamCount();
    EXPECT_EQ(0u, audio_streams_tracker.max_stream_count());
}

} // namespace media
